home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
c
/
cppmatrx.zip
/
MATRIX.ZIP
/
MATRIX.BAK
next >
Wrap
Text File
|
1991-02-02
|
9KB
|
386 lines
#include <iostream.h>
#include <stdarg.h>
#include <math.h>
typedef double matrix_t;
class matrix {
matrix_t *matrix_data;
size_t matrix_size;
public:
matrix (size_t matrix_length, ...);
matrix (char *dummy, size_t matrix_length,matrix_t fill_value=0.0);
matrix (matrix &m);
~matrix (void) { delete matrix_data; }
matrix_t get_elem (size_t row, size_t column) { return *(matrix_data + (row-1)*matrix_size + (column-1)); }
matrix_t put_elem (size_t row, size_t column, matrix_t elem) { return (*(matrix_data + (row-1)*matrix_size + (column-1)) = elem); }
matrix_t* operator[] (size_t row) { return matrix_data + row*matrix_size; }
matrix_t& operator() (size_t row, size_t column) { return *(matrix_data + (row-1)*matrix_size + (column-1)); }
matrix operator= (matrix &m);
int operator== (matrix m);
int operator!= (matrix m);
matrix operator+ (matrix m);
matrix operator- (matrix m);
matrix operator- (void);
friend matrix_t det (matrix m);
friend matrix minor (matrix m, size_t m_row, size_t m_column);
friend void transpose (matrix &m);
friend matrix operator* (matrix m, double r);
friend matrix operator* (double r, matrix m);
friend matrix operator* (matrix m, int r);
friend matrix operator* (int r, matrix m);
void print_matrix (void);
};
matrix::matrix (size_t matrix_length, ...)
{
va_list argptr;
size_t elem_count;
matrix_size = matrix_length;
matrix_data = new matrix_t [matrix_size*matrix_size];
matrix_t *i;
size_t count;
va_start (argptr, matrix_length);
elem_count = matrix_size*matrix_size;
for (i = matrix_data, count = 1; count <= elem_count; i++, count++) {
*i = (va_arg (argptr, matrix_t));
}
va_end (argptr);
cout << "\nCreated object Matrix\n";
}
matrix::matrix (char *dummy, size_t matrix_length,matrix_t fill_value)
{
size_t elem_count;
matrix_size = matrix_length;
matrix_data = new matrix_t [matrix_size*matrix_size];
matrix_t *i;
size_t count;
elem_count = matrix_size*matrix_size;
for (i = matrix_data, count = 1; count <= elem_count; count++, i++)
*i = fill_value;
cout << "\nCreated zero matrix.\n";
}
#if 0
matrix::~matrix (void)
{
delete matrix_data;
// cout << "\nDeleted object Matrix\n";
}
#endif
#if 0
matrix_t matrix::get_elem (size_t row, size_t column)
{
}
matrix_t matrix::put_elem (size_t row, size_t column, matrix_t elem)
{
}
#endif
void matrix::print_matrix (void)
{
matrix_t *i;
size_t row_count, column_count;
cout << '\n';
for (i = matrix_data, row_count = 0, column_count = 0; row_count < matrix_size; i++) {
cout << *i << ' ';
if (column_count == (matrix_size - 1)) {
column_count = 0;
row_count++;
cout << '\n';
}
else
column_count++;
}
}
#if 0
matrix_t* matrix::operator[] (size_t row)
{
// return a reference to the first element in a given row
}
matrix_t& matrix::operator() (size_t row, size_t column)
{
}
#endif
matrix::matrix (matrix &m)
{
matrix_t *i, *j;
size_t count, elem_count;
matrix_size = m.matrix_size;
elem_count = matrix_size*matrix_size;
matrix_data = new matrix_t [elem_count];
for (i = matrix_data, j = m.matrix_data, count = 1; count <= elem_count; count++, i++, j++)
*i = *j;
}
matrix matrix::operator= (matrix &m)
{
size_t elem_count;
matrix_t *i, *j;
size_t count;
delete matrix_data; // erase the current contents of the matrix on the left
// side of the assignment
matrix_size = m.matrix_size;
elem_count = matrix_size * matrix_size;
matrix_data = new matrix_t [elem_count]; // allocate space for the new matrix, identical to the argument
for (i = matrix_data, j = m.matrix_data, count = 1; count <= elem_count; count++, i++, j++)
*i = *j;
return *this;
}
matrix matrix::operator+ (matrix m)
{
matrix temp ("*",matrix_size);
matrix_t *i, *j, *k;
size_t counter;
size_t elem_count;
elem_count = matrix_size * matrix_size;
for (i = matrix_data, j = m.matrix_data, k = temp.matrix_data, counter = 1;
counter <= elem_count; i++, j++, k++, counter++)
*k = *i + *j;
return temp;
}
matrix matrix::operator- (matrix m)
{
matrix temp ("*",matrix_size);
matrix_t *i, *j, *k;
size_t counter;
size_t elem_count;
elem_count = matrix_size * matrix_size;
for (i = matrix_data, j = m.matrix_data, k = temp.matrix_data, counter = 1;
counter <= elem_count; i++, j++, k++, counter++)
*k = *i - *j;
return temp;
}
inline void swap (matrix_t &a, matrix_t &b)
{
matrix_t temp;
temp = a;
a = b;
b = temp;
}
void transpose (matrix &m)
{
size_t i,j;
for (i = 2; i <= m.matrix_size; i++)
for (j = 1; j <= i-1; j++)
swap (m (i,j), m (j,i));
}
matrix minor (matrix m, size_t m_row, size_t m_column)
{
matrix temp ("*", m.matrix_size-1);
for (column = 1, temp_column = 1; column <= matrix_size; column++) {
if (column != m_column) {
for (row = 1; row <= matrix_size; row++)
if (row != m_row) {
temp (temp_row, temp_column) = m (row, column);
temp_row++;
}
temp_column++;
}
}
return temp;
}
matrix_t det (matrix m)
{
int factor;
if (m.matrix_size == 2)
return m (1,1)*m (2,2) - m (1,2)*m (2,1);
else {
matrix_t value = 0.0;
size_t col;
size_t temp_row, temp_col;
size_t current_col;
matrix temp ("*",m.matrix_size-1);
for (col = 1, factor = 1; col <= m.matrix_size; col++, factor *= (-1)) {
for (current_col = 1, temp_col = 1; current_col <= m.matrix_size; current_col++)
if (current_col != col) {
for (temp_row = 2; temp_row <= m.matrix_size; temp_row++)
temp (temp_row-1,temp_col) = m (temp_row,current_col);
temp_col++;
}
value += m (1, col) * det (temp) * factor;
}
return value;
}
}
int matrix::operator== (matrix m)
{
if (matrix_size == m.matrix_size)
return ! memcmp (matrix_data, m.matrix_data, matrix_size*matrix_size);
else
return 0;
}
int matrix::operator!= (matrix m)
{
if (matrix_size == m.matrix_size)
return memcmp (matrix_data, m.matrix_data, matrix_size*matrix_size);
else
return 1;
}
matrix operator* (matrix m, double r)
{
matrix temp ("*",m.matrix_size);
matrix_t *i, *t;
size_t count, elem_count = m.matrix_size*m.matrix_size;
for (i = m.matrix_data, t = temp.matrix_data, count = 1; count <= elem_count; i++, t++, count++)
*t = *i * r;
return temp;
}
matrix operator* (double r, matrix m)
{
matrix temp ("*",m.matrix_size);
matrix_t *i, *t;
size_t count, elem_count = m.matrix_size*m.matrix_size;
for (i = m.matrix_data, t = temp.matrix_data, count = 1; count <= elem_count; i++, t++, count++)
*t = *i * r;
return temp;
}
matrix operator* (matrix m, int r)
{
matrix temp ("*",m.matrix_size);
matrix_t *i, *t;
size_t count, elem_count = m.matrix_size*m.matrix_size;
for (i = m.matrix_data, t = temp.matrix_data, count = 1; count <= elem_count; i++, t++, count++)
*t = *i * r;
return temp;
}
matrix operator* (int r, ma